package class3;

import common.ListNode;
import common.ListNodeUtils;

/**
 * 删除链表的节点
 * https://leetcode.cn/problems/shan-chu-lian-biao-de-jie-dian-lcof/description/
 * <p>
 * 描述1：
 * 给定单向链表的头指针和一个要删除的节点的值，定义一个函数删除该节点。
 * 返回删除后的链表的头节点。
 * <p>
 * 示例 1：
 * 输入：head = [4,5,1,9], val = 5
 * 输出：[4,1,9]
 * 解释：给定你链表中值为 5 的第二个节点，那么在调用了你的函数之后，该链表应变为 4 -> 1 -> 9.
 * <p>
 * 示例 2：
 * 输入：head = [4,5,1,9], val = 1
 * 输出：[4,5,9]
 * 解释：给定你链表中值为 1 的第三个节点，那么在调用了你的函数之后，该链表应变为 4 -> 5 -> 9.
 * <p>
 */
public class Code12_DeleteNode {
    public static void main(String[] args) {
        ListNode head = ListNodeUtils.getLinked(1, 2, 3, 4, 5, 6, 7);
        int target = 4;
        ListNode listNode = deleteNode(head, target);
        ListNodeUtils.print(listNode);

        ListNode head2 = ListNodeUtils.getLinked(1, 2, 3, 4, 5, 6, 7);
        ListNode listNode1 = deleteNodeAtFraction(head2, 5, 10);
        ListNodeUtils.print(listNode1);

    }

    public static ListNode deleteNode(ListNode head, int val) {
        if (head == null) {
            return null;
        }
        if (head.val == val) {
            head = head.next;
        }

        ListNode cur = head;
        while (cur != null && cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;
            }
            cur = cur.next;
        }
        return head;
    }

    /**
     * 删除链表中a/b的节点
     *
     * @return
     */
    public static ListNode deleteNodeAtFraction(ListNode head, int a, int b) {
        if (head == null) {
            return null;
        }
        int len = 0;
        ListNode cur = head;
        while (cur != null) {
            cur = cur.next;
            len++;
        }
        int pos = (int) Math.ceil((a * len) / b);
        if(pos == 1){
            head = head.next;
        }
        if(pos>1){
            cur = head;
            while(--pos != 1){
                cur = cur.next;
            }
            cur.next = cur.next.next;
        }
        return head;

    }

    /**
     * 删除链表中间一个节点：
     * https://leetcode.cn/problems/delete-node-in-a-linked-list/description/
     * 题目描述：
     * +有一个单链表的 head，我们想删除它其中的一个节点 node。
     * 给你一个需要删除的节点 node 。你将 无法访问 第一个节点  head。
     * <p>
     * 链表的所有值都是 唯一的，并且保证给定的节点 node 不是链表中的最后一个节点。
     * 删除给定的节点。注意，删除节点并不是指从内存中删除它。这里的意思是：
     * 给定节点的值不应该存在于链表中。
     * 链表中的节点数应该减少 1。
     * node 前面的所有值顺序相同。
     * node 后面的所有值顺序相同。
     */
    public static void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }

}
